package com.imm.logica;

import java.sql.SQLException;
import java.sql.Timestamp;


import com.imm.dominio.Anulado;
import com.imm.dominio.DataAnulado;
import com.imm.dominio.DataVenta;
import com.imm.dominio.Venta;

public class AdminVentaImp implements IAdminVenta {
	
	private AdminVentaImp() {}
	
	private static AdminVentaImp instancia = new AdminVentaImp();  
	 
	public static AdminVentaImp getInstance() {  
		  return instancia;  
		 }  	

	public DataVenta IngresarVenta(DataVenta dataventa){		
		Venta venta = DataVenta2Venta(dataventa);
	    try {
			venta.setImporte(calcularMontoEstacionamiento(dataventa.getMinutos()));
		} catch (SQLException e1) {
			e1.printStackTrace();
		} 
	    
		DataVenta retornofinal = Venta2DataVenta(venta);	
	
		if (VerificarDatosVentas(venta)) {			
			Venta retornoparcial;
			try {
				retornoparcial = IAdminIMMCobranza.getIPersistencia().AltaVenta(venta);
				retornofinal.setId(retornoparcial.getId());
		   	    retornofinal.setError(0);
			     retornofinal.setId_Agencia(dataventa.getId_Agencia());
			} catch (SQLException e) {
				e.printStackTrace();
			}		   
		}
		return retornofinal;		
	}

	private boolean VerificarDatosVentas(Venta venta) {
		return true;
	}

	public DataAnulado AnularVenta(Integer id_Venta, Integer id_Agencia) {
		DataAnulado dataAnulado = new DataAnulado();
		Anulado anulado = new Anulado();
		Venta venta = new Venta();
		
		try {
			venta = IAdminIMMCobranza.getIPersistencia().buscarVenta(id_Venta);
			
			if(verificarVentaAnulada(venta)){
				 anulado = IAdminIMMCobranza.getIPersistencia().AnularVentaBD(venta);
				
				 if(anulado.getId()==0){
					 dataAnulado.setError(1);
					 dataAnulado.setId_Agencia(id_Agencia);
					 dataAnulado.setId_AnuladoIMM(0);
					 dataAnulado.setId_Ticket(venta.getId());
				 }else{
					 dataAnulado.setError(0);
					 dataAnulado.setFecha(anulado.getFecha().getTime());
					 dataAnulado.setId_Agencia(id_Agencia);
					 dataAnulado.setId_AnuladoIMM(anulado.getId());
					 dataAnulado.setId_Ticket(venta.getId());
				 }
			}else{
				 dataAnulado.setError(2);
			 }
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			 dataAnulado.setError(2);
			e.printStackTrace();
		}
		return dataAnulado;	
	}
	
	private Venta DataVenta2Venta (DataVenta v){
		Venta a = new Venta();		
	    a.setFechaInicio(new Timestamp(v.getFechaInicio()));
     	a.setFechaVenta(new Timestamp(v.getFechaVenta()));
        a.setIdAgencia(v.getId_Agencia());
		a.setImporte(v.getImporte());
		a.setMatricula(v.getMatricula());
		a.setMinutos(v.getMinutos());
		return a;		
	}
	
	private DataVenta Venta2DataVenta (Venta v){
		DataVenta a = new DataVenta();
		a.setFechaInicio(v.getFechaInicio().getTime());
		a.setFechaVenta(v.getFechaVenta().getTime());
		a.setImporte(v.getImporte());
		a.setMatricula(v.getMatricula());
		a.setMinutos(v.getMinutos());
		return a;
	}
	
	public Boolean verificarVentaAnulada(Venta venta) throws SQLException {
		if(IAdminIMMCobranza.getIPersistencia().verificarDatosVentas(venta)){
			if(IAdminIMMCobranza.getIPersistencia().verificarVentaAnulada(venta)){
				return false;
			}
			return true;
		}else{
			return false;
		}
	}

	private Double calcularMontoEstacionamiento(Integer minutos) throws SQLException{
		Integer minutoQuiebre = IAdminIMMCobranza.getIPersistencia().obtenerMinutoQuiebre();
		Double costoMinuto =  IAdminIMMCobranza.getIPersistencia().montoMinuto();
		Integer resultado = minutos/minutoQuiebre;
		
		if(minutos%minutoQuiebre != 0){
			resultado += 1;
		}
		Double montoEst = resultado * costoMinuto;
		
		return montoEst;
		
	}
}
